/*
 *  util.h, Copyright (c) 2016, mogujie.com
 *  All rights reserved
 *
 *  Created on: 2016年2月28日
 *      Author: yongxue@mogujie.com
 */

#ifndef EXCEPTION_UTIL_H_
#define EXCEPTION_UTIL_H_

#include <stdexcept>
#include <string>

#include "base/base.h"
using namespace std;

/**
 * 错误单元的命名空间
 */
namespace except_util {
/**
 * 异常类
 * todo: 可以考虑利用接口backtrace和backtrace_symbols获取出问题时的堆栈信息
 */
class Exception: public exception {
	public:
		/**
		 * 构造函数，抛出异常时，直接构造错误对象
		 */
		explicit Exception(IN const string& msg);
		Exception(IN const string& msg, IN int code);

		/**
		 * 析构函数，采用virtual修饰，表示该类一般是作为基类使用
		 * 并且throw()表示不抛出任何异常
		 */
		virtual ~Exception() throw();

		void set_msg(IN const string& msg) { m_msg = msg; return; }
		void set_code(IN int code) { m_code = code; return; }

		/**
		 * 得到错误信息
		 * const throw()不抛出任何异常
		 */
		virtual const char* what() const throw() { return m_msg.c_str(); };
		virtual const string& what() const throw() { return m_msg; };

		/**
		 * 得到错误码
		 */
		int code() { return m_code; }

	private:
		/**
		 * 错误信息
		 */
		std::string m_msg;
		/**
		 * 错误码
		 */
		int 		m_code;
};
}


#endif /* EXCEPTION_UTIL_H_ */
